"""
通用对话框组件。
"""
import typing

from .base import BaseSession, BaseSessionType, BaseSessionParentType
from .framework import dispatch, session_received
from .utils import to_any


@session_received
class GenericDialog(BaseSession):
    """
    通用对话框组件。
    可以实现显示文本。
    """
    name = 'GenericDialog'

    @classmethod
    async def create(cls: typing.Type[BaseSessionType], parent: BaseSessionParentType, *args: typing.Any,
                     **kwargs: typing.Dict) -> BaseSessionType:
        """
        创建一个通用对话框并显示。
        四个参数：
        @title: 对话框标题；
        @message: 提示内容；
        @okButtonText: 确定按钮文字（可选，默认为None），如果为None则不显示此按钮；
        @cancelButtonText: 取消按钮文字（可选，默认为None），如果为None则不显示此按钮。
        """
        if len(args) < 2:
            raise TypeError('Missing 1 required positional argument: `title` and `message`.')
        title = to_any(args[0])
        message = to_any(args[1])
        ok_button_text = to_any(args[2] if len(args) > 2 else None)
        cancel_button_text = to_any(args[3] if len(args) > 3 else None)
        return await super().create(parent, title, message, ok_button_text, cancel_button_text, **kwargs)

    async def set_on_cancel_listener(self, func: typing.Optional[typing.Callable] = None):
        """
        设置对话框被用户取消时的监听函数，如果传入None则不监听。
        调用示例：
        async def cb(): pass
        await dialog.set_on_cancel_listener(cb)
        await dialog.set_on_cancel_listener(None)
        """
        dispatch(self.send_action('setOnCancelListener', self.create_callback(func)))

    async def set_message(self, message: str):
        """
        设置对话框提示的信息。
        @message: 向用户提示的文字。
        """
        dispatch(self.send_action('setMessage', to_any(message)))

    async def set_title(self, title: str):
        """
        设置对话框的标题。
        @title: 对话框标题文字。
        """
        dispatch(self.send_action('setTitle', to_any(title)))

    async def set_ok_button_text(self, text: str):
        """
        设置对话框确定按钮的文字。
        @text: 按钮文字。
        """
        dispatch(self.send_action('setOkButtonText', to_any(text)))

    async def set_cancel_button_text(self, text: str):
        """
        设置对话框取消按钮的文字。
        @text: 按钮文字。
        """
        dispatch(self.send_action('setCancelButtonText', to_any(text)))

    async def set_on_ok_button_click_listener(self, on_click_listener: typing.Optional[typing.Callable] = None):
        """
        设置确定按钮的监听器。
        @onClickListener: 被单击时的监听函数。
        """
        dispatch(self.send_action('setOnOkButtonClickListener', self.create_callback(on_click_listener)))

    async def set_on_cancel_button_click_listener(self, on_click_listener: typing.Optional[typing.Callable] = None):
        """
        设置取消按钮的监听器。
        @onClickListener: 被单击时的监听函数。
        """
        dispatch(self.send_action('setOnCancelButtonClickListener', self.create_callback(on_click_listener)))
